package com.hujifang.elasticsearch.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.List;

/**
 * <一句话功能简述>
 * <功能详细描述>
 * 
 * @author  liyanyu
 * @version  [版本号, 2014年7月8日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public final class JSONUtils{
	/** json字符串转换为相应对象
	 * <功能详细描述>
	 * @param json
	 * @param clazz
	 * @return [参数说明]
	 * 
	 * @return T [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static <T> T toBean(String json, Class<T> clazz){
		if(StringUtils.isNullString(json)) return null;
		return JSON.parseObject(json, clazz);
	}

	/**对象之间转换，例如map类型转换为其他VO类型
	 * <功能详细描述>
	 * @param object
	 * @param clazz
	 * @return [参数说明]
	 * 
	 * @return T [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static <T> T toBean(Object object, Class<T> clazz){
		if(null == object) return null;
		return JSON.parseObject(toJson(object), clazz);
	}

	/**把json串直接转化为list数组
	 * <功能详细描述>
	 * @param json
	 * @param clazz
	 * @return [参数说明]
	 * 
	 * @return List<T> [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static <T> List<T> toList(String json, Class<T> clazz){
		if(StringUtils.isNullString(json)) return null;
		return JSON.parseArray(json, clazz);
	}

	/** 把普通对象转换为json字符串
	 * @see #toJsonStr(Object, String, int)
	 */
	@Deprecated
	public static String toJson(Object object){
		/*if(null == object) return null;
		return JSON.toJSONStringWithDateFormat(object,"yyyy-MM-dd HH:mm:ss",SerializerFeature.WriteMapNullValue);*/
		return toJsonStr(object, "yyyy-MM-dd HH:mm:ss", 1);
	}
	
	/**
	 * 将一个对象转化成json字符串 <br/>
	 * @param obj 待转换对象
	 * @return json字符串
	 * @author LiHao™
	 */
	public static String toJsonStr(Object obj){
		return toJsonStr(obj, null, 0);
	}
	/**
	 * 将一个对象转化成json字符串 <br/>
	 * @param obj 待转换对象
	 * @param dateFormat 日期类型的值的格式化，null默认采用毫秒数
	 * @param bit 位运算,1:输出null属性,2:为属性加引号
	 * @return json字符串
	 * @author LiHao™
	 */
	public static String toJsonStr(Object obj, String dateFormat, int bit){
		if(null == obj) return null;
		SerializeWriter out = null;
		try{
			out = new SerializeWriter();
			JSONSerializer serializer = new JSONSerializer(out);
			if((bit & 1) == 1){
				serializer.config(SerializerFeature.WriteMapNullValue, true);
			}
			if((bit & 2) == 2){
				serializer.config(SerializerFeature.QuoteFieldNames, true);
			}
			if(dateFormat != null){
				serializer.config(SerializerFeature.WriteDateUseDateFormat, true);
				serializer.setDateFormat(dateFormat);
			}
			serializer.write(obj);
			return out.toString();
		}finally{
			if(out != null) out.close();
		}
	}
}